第 3 章:認識與設定映像檔倉庫
Public Docker Hub
目前 Docker 官方維護了一個公共倉庫 Docker Hub,其中已經包括了超過 15,000 的映像檔。大部分需求,都可以透過在 Docker Hub 中直接下載映像檔來實作。
登錄 Docker Hub
可以透過執行 docker login
命令來輸入使用者名稱、密碼和電子信箱來完成註冊和登錄。
註冊成功後,本地使用者目錄的 .dockercfg
中將保存使用者的認證訊息。
Docker Hub 基本操作
使用者無需登錄即可透過 docker search
命令來查詢官方倉庫中的映像檔,並利用 docker pull
命令來將它下載到本地。 例如以 centos 為關鍵字進行搜尋:
sudo docker search centos
可以看到顯示了很多 包含關鍵字的映像檔,其中包括映像檔名字、描述、星級(表示該映像檔的受歡迎程度)、是否官方建立、是否自動建立。 官方的映像檔說明是官方專案組建立和維護的,automated 資源允許使用者驗證映像檔的來源和內容。
根據是否是官方提供,可將映像檔資源分為兩類。 一種是類似 centos 這樣的基礎映像檔,被稱為基礎或根映像檔。這些基礎映像檔是由 Docker 公司建立、驗證、支援、提供。這樣的映像檔往往使用單個單詞作為名字。 還有一種類型,比如 tianon/centos
映像檔,它是由 Docker 的使用者建立並維護的,往往帶有使用者名稱前綴。可以透過前綴 user_name/
來指定使用某個使用者提供的映像檔,比如 tianon 使用者。
另外,在查詢的時候透過 -s N
參數可以指定僅顯示評價為 N
星以上的映像檔。
下載官方 centos 映像檔到本地。
sudo docker pull centos
Pulling repository centos
0b443ba03958: Download complete
539c0211cd76: Download complete
511136ea3c5a: Download complete
7064731afe90: Download complete
使用者也可以在登錄後透過 docker push
命令來將映像檔推送到 Docker Hub。
自動建立 Automated Builds
功能對於需要經常升級映像檔內程式來說,十分方便。 有時候,使用者建立了映像檔,安裝了某個軟體,如果軟體發布新版本則需要手動更新映像檔。。
而自動建立允許使用者透過 Docker Hub 指定跟蹤一個目標網站(目前支援 GitHub 或 BitBucket)上的專案,一旦專案發生新的提交,則自動執行建立。
要設定自動建立,包括以下的步驟:
- 建立並登陸 Docker Hub,以及目標網站
- 在目標網站中連結帳戶到 Docker Hub
- 在 Docker Hub 中 設定一個自動建立
- 選取一個目標網站中的專案(需要含 Dockerfile)和分支
- 指定 Dockerfile 的位置,並提交建立
之後,可以 在Docker Hub 的 自動建立頁面 中跟蹤每次建立的狀態。
把 Docker Image 部署到 Docker hub
如果我們要將這個 Docker Image 分享給其他人用,有幾個方法:
- 直接把 Dockerfile 傳給其他人用,但是拿到 Dockerfile 之後要花一點時間重新 Build Image
- 把 Docker Image 放在公開或私有的網路上給人 Pull 下來使用
- 在沒有網路環境的狀況下適合使用 Import/Export 檔案的方式
預計流程
- 註冊 Docker Hub 帳號
- 把 Docker Image Push 到 Docker Hub 上
- 測試是否成功的把 Docker Image Push 到 Docker Hub 上
docker image
實際流程
-
註冊 Docker Hub 帳號
-
把 Docker Image Push 到 Docker Hub 上
Push 前,需要把 Docker Image 加上 tag
docker tag mytomcat gutterstars/mytomcat
使用的 Docker tag 格式
docker tag ${Image Name} DockerHub帳號/Image Name
- 輸入
docker login
指令登入到 Docker Hub - 使用
docker push
指令把 Docker Image Push 到 Docker Hub 裡
docker push jackyohhub/mytomcat
- 測試是否成功的把 Docker Image Push 到 Docker Hub 上
- 在 Docker Hub 網站裡,登入帳號進去可以看到 Repositories 已經有 jackyohhub/mytomcat 的 Docker Image
- 使用
docker rm
指令把 local 的 Image 刪除掉,測試從 Docker Hub pull Docker Image 下來
docker rmi -f jackyohhub/mytomcat
docker rmi -f mytomcat
- 從 Docker Hub Pull Docker Image 下來
docker pull jackyohhub/mytomcat
- 啟動 Docker Container
docker run -p 8080:8080 jackyohhub/mytomcat
- 使用 Browser 查看結果,輸入 URL 位址為 http://localhost:8080
Private 私有倉庫
需要把 Docker Image放在內部網路裡,不適合把 Docker Image 放到公開的網路上
- 有些軟體有 License 的問題
- 有安全性的問題
- 希望更快的網路速度
使用 docker-registry
是官方提供的工具,可以用於建立私有的映像檔倉庫。
安裝執行 docker-registry
- 容器執行
在安裝了 Docker 後,可以透過取得官方 registry 映像檔來執行。
sudo docker run -d -p 5000:5000 registry
這將使用官方的 registry 映像檔來啟動本地的私有倉庫。使用者可以透過指定參數來設定私有倉庫位置,例如設定映像檔儲存到 Amazon S3 服務。
sudo docker run \
-e SETTINGS_FLAVOR=s3 \
-e AWS_BUCKET=acme-docker \
-e STORAGE_PATH=/registry \
-e AWS_KEY=AKIAHSHB43HS3J92MXZ \
-e AWS_SECRET=xdDowwlK7TJajV1Y7EoOZrmuPEJlHYcNP2k4j49T \
-e SEARCH_BACKEND=sqlalchemy \
-p 5000:5000 \
registry
此外,還可以指定本地路徑(如 /home/user/registry-conf
)下的設定檔案。
sudo docker run -d -p 5000:5000 -v /home/user/registry-conf:/registry-conf -e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml registry
- d:執行的 docker container 是 run 在背景的狀態,所以需要使用
docker logs
的指令才可以看到 log 狀態 - p:主機的 5000 port mapping 到 container 的 5000 port
- v:因為 push 到 docker registry 的資料是放在 container 裡面的,如果把 docker container 刪除掉 docker registry 的 Image 資料就會不見,因此需要使用 –v 參數將主機的檔案路徑 mapping 到 container 裡面的檔案路徑,這樣 docker container 被刪除 docker registry 的 Image 資料還會存在
- -name:設定 docker container 的名稱
預設情況下,倉庫會被建立在容器的 /tmp/registry
下。可以透過 -v
參數來將映像檔檔案存放在本地的指定路徑。 例以下面的例子將上傳的映像檔放到 /opt/data/registry
目錄。
sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
- 本地安裝
對於 Ubuntu 或 CentOS 等發行版,可以直接透過套件庫安裝。
#Ubuntu
sudo apt-get install -y build-essential python-dev libevent-dev python-pip liblzma-dev swig$ sudo pip install docker-registry
#CentOS
sudo yum install -y python-devel libevent-devel python-pip gcc xz-devel$ sudo python-pip install docker-registry
也可以從 docker-registry 專案下載原始碼進行安裝。
sudo apt-get install build-essential python-dev libevent-dev python-pip libssl-dev liblzma-dev libffi-dev
git clone https://github.com/docker/docker-registry.git
cd docker-registrysudo python setup.py install
然後修改設定檔案,主要修改 dev 模板段的 storage_path
到本地的儲存倉庫的路徑。
cp config/config_sample.yml config/config.yml
之後啟動 Web 服務
sudo gunicorn -c contrib/gunicorn.py docker_registry.wsgi:application
sudo gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application
此時使用連結本地的 5000 連接埠,看到輸出 docker-registry 的版本訊息說明執行成功。
- 註:
config/config_sample.yml
檔案是範例設定檔案。
在私有倉庫上傳、下載、搜尋映像檔
- 建立好私有倉庫之後,就可以使用
docker tag
來標記一個映像檔,然後推送它到倉庫,別的機器上就可以下載下來了。例如私有倉庫位址為192.168.7.26:5000
- 先在本機查看已有的映像檔。
sudo docker images
IMAGE ID CREATED VIRTUAL SIZEubuntu latest ba5877dc9bec 6 weeks ago 192.7 MBubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB
- 使用
docker tag
將ba58
這個映像檔標記為192.168.7.26:5000/test
(格式為docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
)。
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MBubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
- 使用
docker push
上傳標記的映像檔。
$ sudo docker push 192.168.7.26:5000/test
The push refers to a repository [192.168.7.26:5000/test] (len: 1)
Sending image list
Pushing repository 192.168.7.26:5000/test (1 tags)
Image 511136ea3c5a already pushed, skipping
Image 9bad880da3d2 already pushed, skipping
Image 25f11f5fb0cb already pushed, skipping
Image ebc34468f71d already pushed, skipping
Image 2318d26665ef already pushed, skipping
Image ba5877dc9bec already pushed, skipping
Pushing tag for rev [ba5877dc9bec] on {http://192.168.7.26:5000/v1/repositories/test/tags/latest}
- 用 curl 查看倉庫中的映像檔。
$ curl http://192.168.7.26:5000/v1/search
{"num_results": 7, "query": "", "results": [{"description": "", "name": "library/miaxis_j2ee"}, {"description": "", "name": "library/tomcat"}, {"description": "", "name": "library/ubuntu"}, {"description": "", "name": "library/ubuntu_office"}, {"description": "", "name": "library/desktop_ubu"}, {"description": "", "name": "dockerfile/ubuntu"}, {"description": "", "name": "library/test"}]}
- 表明映像檔已經被成功上傳了。
- 現在可以到另外一臺機器去下載這個映像檔。
sudo docker pull 192.168.7.26:5000/test
Pulling repository 192.168.7.26:5000/test
ba5877dc9bec: Download complete
511136ea3c5a: Download complete
9bad880da3d2: Download complete
25f11f5fb0cb: Download complete
ebc34468f71d: Download complete
2318d26665ef: Download complete
sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
- 可以使用 這個腳本 批次上傳本地的映像檔到註冊伺服器中,預設為本地註冊伺服器
127.0.0.1:5000
。例如:
wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh; sudo chmod a+x push_images.sh
./push_images.sh ubuntu:latest centos:centos7
The registry server is 127.0.0.1
Uploading ubuntu:latest...
The push refers to a repository [127.0.0.1:5000/ubuntu] (len: 1)
Sending image list
Pushing repository 127.0.0.1:5000/ubuntu (1 tags)
Image 511136ea3c5a already pushed, skipping
Image bfb8b5a2ad34 already pushed, skipping
Image c1f3bdbd8355 already pushed, skipping
Image 897578f527ae already pushed, skipping
Image 9387bcc9826e already pushed, skipping
Image 809ed259f845 already pushed, skipping
Image 96864a7d2df3 already pushed, skipping
Pushing tag for rev [96864a7d2df3] on {http://127.0.0.1:5000/v1/repositories/ubuntu/tags/latest}
Untagged: 127.0.0.1:5000/ubuntu:latest
Done
Uploading centos:centos7...
The push refers to a repository [127.0.0.1:5000/centos] (len: 1)
Sending image list
Pushing repository 127.0.0.1:5000/centos (1 tags)
Image 511136ea3c5a already pushed, skipping
34e94e67e63a: Image successfully pushed
70214e5d0a90: Image successfully pushed
Pushing tag for rev [70214e5d0a90] on {http://127.0.0.1:5000/v1/repositories/centos/tags/centos7}
Untagged: 127.0.0.1:5000/centos:centos7
Done
設定檔案
Docker 的 Registry 利用設定檔案提供了一些倉庫的模組(flavor),使用者可以直接使用它們來進行開發或生產部署。
模組
在 config_sample.yml
檔案中,可以看到一些現成的模組段:
common
:基礎設定local
:儲存資料到本地檔案系統s3
:儲存資料到 AWS S3 中dev
:使用local
模組的基本設定test
:單元測試使用prod
:生產環境設定(基本上跟s3設定類似)gcs
:儲存資料到 Google 的雲端swift
:儲存資料到 OpenStack Swift 服務glance
:儲存資料到 OpenStack Glance 服務,本地檔案系統為後備glance-swift
:儲存資料到 OpenStack Glance 服務,Swift 為後備elliptics
:儲存資料到 Elliptics key/value 儲存
使用者也可以新增自訂的模版段。
預設情況下使用的模組是 dev
,要使用某個模組作為預設值,可以新增 SETTINGS_FLAVOR
到環境變數中,例如
export SETTINGS_FLAVOR=dev
另外,設定檔案中支援從環境變數中載入值,語法格式為 _env:VARIABLENAME[:DEFAULT]
。
範例設定
common:
loglevel: info
search_backend: "_env:SEARCH_BACKEND:"
sqlalchemy_index_database:
"_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db"
prod:
loglevel: warn
storage: s3
s3_access_key: _env:AWS_S3_ACCESS_KEY
s3_secret_key: _env:AWS_S3_SECRET_KEY
s3_bucket: _env:AWS_S3_BUCKET
boto_bucket: _env:AWS_S3_BUCKET
storage_path: /srv/docker
smtp_host: localhost
from_addr: docker@myself.com
to_addr: my@myself.com
dev:
loglevel: debug
storage: local
storage_path: /home/myself/docker
test:
storage: local
storage_path: /tmp/tmpdockertmp
查詢 Docker Image 資訊
查詢 Docker Registry 裡的 Docker Image 資訊主要可以透過二種方式,第一種直接使用Docker Registry 提供的 Restful API 查詢,第二種是使用有 WebUI 畫面的方式來查詢,今天都會介紹到。
查詢 Docker Registry 有哪些 Docker Image 前的準備
- 檢查 Docker Registry 有沒有啟動,如果沒有啟動使用
docker start <container name>
指令 - 把防火牆關閉
systemctl stop firewalld
systemctl disable firewalld
使用 Docker Registry 提供的 Restful API 來查詢 Docker Registry 資訊
使用 curl 指令來查詢 Docker Registry 有哪些的 Docker Image
curl -X GET http://192.168.182.134:5000/v2/_catalog
使用 curl 指令來查詢 Docker Image 有哪些的 tag
curl -X GET http://192.168.182.134:5000/v2/mytomcat/tags/list
使用curl 指令來查詢Docker Image 的詳細資訊
curl -X GET http://192.168.182.134:5000/v2/mytomcat/manifests/latest
可以參考以下的網站,裡面有更多使用 Docker Registry Restful API 的方法https://docs.docker.com/registry/spec/api/#detail
使用 Docker Web UI 工具
使用 hyper/docker-registry-web 所提供的 Docker Web UI 工具
docker run -d -p 8080:8080 --name registry-web --link registry -e REGISTRY_URL=http://192.168.182.134:5000/v2 hyper/docker-registry-web
直接在 Browser 上輸入 http://192.168.182.134:8080 的 URL 就可以看到 Docker Registry 上有哪些 Docker Image 的資訊